/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Persistencia;
import Motor.ClaseUtilitaria;
import Motor.Cliente;
import Motor.Factura;
import Motor.Producto;
import Motor.TarjetaDeAfiliado;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

//import java.text.ParseException;
//import java.util.ArrayList;
//import java.util.Iterator;
//import java.util.List;
import org.jdom.Document;
import org.jdom.JDOMException;
import org.jdom.output.XMLOutputter;

/**
 *
 * @author Davielis
 */


public class DAOProductoXML
{

    /** variable que contiene la raiz del documento Xml*/
    private Element root;
    /** variable que contiene la localizacion del archivo xml*/
	private String fileLocation = "src//archivo//Productos.xml";

//    /**
//     * constructor por defecto que inicia los valores para trabajar con el documento
//     * xml
//     */
   public DAOProductoXML()
   {
        try
		{
            SAXBuilder builder = new SAXBuilder(false);
            Document doc = null;
            doc = builder.build(fileLocation);
            root = doc.getRootElement();
        } catch (JDOMException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        }
    }

/*Aqui lleno todo el contexto que le voy a insertar al archivo, es decir
    el nodo principal que es Cliente con los atributos que le corresponden,
    los cuales seria cedula,nombre y apellido,etc*/

    private Element ProductotoXmlElement(Producto producto) throws IOException
	{
        Element raizProducto = new Element("producto");

        Element nombre = new Element("nombre");
        nombre.setText(producto.getNombreProducto());
		Element idProducto = new Element("idProducto");
        idProducto.setText(Integer.toString(producto.getIdProducto()));
		Element descripcion = new Element("descripcion");
        descripcion.setText(producto.getDescripcion());
		Element rubro = new Element("rubro");
        rubro.setText(producto.getRubro());

		Element unidades = new Element("unidades");
        unidades.setText(producto.getUnidades());

		Element precioCompra = new Element("precioCompra");
        precioCompra.setText(Integer.toString(producto.getPrecioCompra()));
		Element precioVenta = new Element("precioVenta");
        precioVenta.setText(Integer.toString(producto.getPrecioVenta()));
		Element productoOferta = new Element("productoOferta");
        productoOferta.setText(Boolean.toString(producto.isProductoOferta()));
		Element porcentajeOferta = new Element("porcentajeOferta");
        porcentajeOferta.setText(Integer.toString(producto.getPorcentajeOferta()));
		Element controlPrecio = new Element("controlPrecio");
        controlPrecio.setText(Boolean.toString(producto.isControlPrecio()));
		Element productoPerecedero = new Element("productoPerecedero");
        productoPerecedero.setText(Boolean.toString(producto.isProductoPerecedero()));

		if(producto.isProductoOferta())
		{
		DAOOfertaXML ofertaDao = new DAOOfertaXML();
		raizProducto.addContent(ofertaDao.OfertatoXmlElement(producto.getLaOferta()));
		}
	raizProducto.addContent(nombre);
	raizProducto.addContent(idProducto);
	raizProducto.addContent(descripcion);
	raizProducto.addContent(rubro);
	raizProducto.addContent(unidades);
	raizProducto.addContent(precioCompra);
	raizProducto.addContent(precioVenta);
	raizProducto.addContent(productoOferta);
	raizProducto.addContent(porcentajeOferta);
	raizProducto.addContent(controlPrecio);
	raizProducto.addContent(productoPerecedero);


	return raizProducto;
  }
//
//   /*Método que retorna un Cliente. A este metodo se le manda un Element y con
//    sus datos se hará los pasos requeridos para crear el Cliente*/


	private Producto ProductoToObject (Element element) throws ParseException
	{
		Producto nuevoProducto = new Producto();
		//DAOTarjetaDeAfiliadoXML tarj = new DAOTarjetaDeAfiliadoXML();
//String nombreProducto, int idProducto, String descripcion, String rubro,
//	String unidades, int precioCompra, int  precioVenta, Boolean productoOferta, int porcentajeOferta,
//	Boolean controlPrecio,Oferta laOferta, String rutaImagen,Boolean productoPerecedero
		nuevoProducto.setNombreProducto(element.getChildText("nombre"));
		nuevoProducto.setIdProducto(Integer.parseInt(element.getChildText("idProducto")));
		nuevoProducto.setDescripcion(element.getChildText("descripcion"));
		nuevoProducto.setRubro(element.getChildText("rubro"));
		nuevoProducto.setUnidades(element.getChildText("unidades"));
		nuevoProducto.setPrecioCompra(Integer.parseInt(element.getChildText("precioCompra")));
		nuevoProducto.setPrecioVenta(Integer.parseInt(element.getChildText("precioVenta")));
		nuevoProducto.setProductoOferta(Boolean.parseBoolean(element.getChildText("productoOferta")));
		nuevoProducto.setPorcentajeOferta(Integer.parseInt(element.getChildText("porcentajeOferta")));
		nuevoProducto.setControlPrecio(Boolean.parseBoolean(element.getChildText("controlPrecio")));
		nuevoProducto.setProductoPerecedero(Boolean.parseBoolean(element.getChildText("productoPerecedero")));

		return nuevoProducto;
	}

//    {
//        Paciente nuevoPaciente = new Paciente();
//	nuevoPaciente.setNombreCompleto(element.getChildText("nombre"));
//        nuevoPaciente.setCedula(Integer.parseInt(element.getChildText("cedula")));
//        String st = (element.getChildText("fechanacimiento"));
//        HoraFecha hf = new HoraFecha(st.split("/"));
//        nuevoPaciente.setFechaNacimiento(hf);
//        nuevoPaciente.setUsuario(element.getChildText("usuario"));
//        nuevoPaciente.setContrasena(element.getChildText("contrasena"));
//        nuevoPaciente.setResidencia(element.getChildText("residencia"));
//        nuevoPaciente.setTelefono(element.getChildText("telefono"));
//        nuevoPaciente.setCuentaActiva(Boolean.parseBoolean(element.getChildText("cuentaactiva")));
////
//        DAOCitaXML tempCita = new DAOCitaXML();
//
//        for (Object it : element.getChildren("cita")) {
//            Element xmlElem = (Element) it;
//            try {
//                nuevoPaciente.agregarCitaMedica(tempCita.CitaToObject(xmlElem));
//            } catch (ParseException ex) {
//                System.out.println(ex.getMessage());
//            }
//        }
//
//        DAOEntradaSalidaXML entSal = new DAOEntradaSalidaXML();
//
//        for (Object it : element.getChildren("entradasalida")) {
//            Element xmlElem = (Element) it;
//            try {
//                nuevoPaciente.nuevoRegistroES(entSal.EntradaSalidaToObject(xmlElem));
//            } catch (ParseException ex) {
//                System.out.println(ex.getMessage());
//            }
//        }
//        if (element.getChild("historia") != null){
//			if(element.getChild("historia").getText().compareTo("")!=0)
//			{
//				DAOHistoriaXML historia = new DAOHistoriaXML();
//				nuevoPaciente.setHistorialPaciente(historia.HistoriaToObject(element.getChild("historia")));
//
//			}
//	    }
//
//        if (element.getChild("plan") != null){
//            DAOPlanXML plan = new DAOPlanXML();
//            nuevoPaciente.setPlanPaciente(plan.PlanToObject(element.getChild("plan")));
//        }
//
//        return nuevoPaciente;
//    }
//
   /* Operacion para guardar en el documento Xml los cambios efectuados
    * @return true si se cumplio la operacion con exito, false en caso contrario*/

    private boolean updateDocument()
	{
        try {
            XMLOutputter out = new XMLOutputter(org.jdom.output.Format.getPrettyFormat());
            FileOutputStream file = new FileOutputStream(fileLocation);
            out.output(root, file);
            file.flush();
            file.close();
            return true;
        } catch (Exception e) {
            System.out.println("error: " + e.getMessage());
            return false;
        }
    }

   /* Operacion que busca un elemento que cumpla con una condicion en el id del xml
     * @param raiz = raiz del documento xml
     * @param dato = elemento a buscar.
     * @return retorna el elemento si existe con la condicion, en caso contrario retorna null */



    public static Element buscar(List raiz, String dato)
	{
        Iterator i = raiz.iterator();
        while (i.hasNext()) {
            Element e = (Element) i.next();
            if (dato.equals(e.getChild("idProducto").getText()))  
			{
                return e;
            }
        }
        return null;
    }


//   //TODO Por adaptar
//   // @return valor boleano con la condicion de exito

	   public boolean agregarProducto(Producto nProducto) throws IOException
	   {
        boolean resultado = false;
		root.addContent(ProductotoXmlElement((Producto) nProducto));
        resultado = updateDocument();
        return resultado;
    }

    /* @param cedula numero de cedula del Cliente a buscar
    * @return objeto Cliente con sus datos segun busqueda*/



	 public Producto buscarProducto(Integer idProducto)
	{
        Element aux = new Element("producto");
        List Productos = this.root.getChildren("producto"); //aca llamo a mis CLIENTES XML  q esta en archivo?
        while (aux != null)
		{
            aux = DAOProductoXML.buscar(Productos,Integer.toString(idProducto));
            if (aux != null) {
                try {
					System.out.println("Producto SI EXISTE");
                    return ProductoToObject(aux);
                } catch (ParseException ex) {
                    System.out.println(ex.getMessage());
                }
            }
        }
			return null;
    }


//    /* @param Estudiante objeto Estudiante a actualizar
//     * @return valor boleano con la condicion de exito */

    public boolean actualizarProducto(Producto nProducto) throws IOException {
        boolean resultado = false;
        Element aux = new Element("paciente");
        List Pacientes = this.root.getChildren("paciente");
        while (aux != null) {
            aux = DAOProductoXML.buscar(Pacientes, Integer.toString(nProducto.getIdProducto()));
            if (aux != null) {
                Pacientes.remove(aux);
                resultado = updateDocument();
            }
        }
        agregarProducto(nProducto);
        return resultado;
    }

//    //TODO Por adaptar
//
    /* @param cedula cedula del Estudiante a borrar
     * @return valor boleano con la condicion de exito  */
    public boolean borrarProducto(Integer idProducto)
	{
        boolean resultado = false;
        Element aux = new Element("producto");
        List Productos = this.root.getChildren("producto");
        while (aux != null) {
            aux = DAOProductoXML.buscar(Productos, Integer.toString(idProducto));
            if (aux != null) {
                Productos.remove(aux);
                resultado = updateDocument();
            }
        }
        return resultado;
    }

//    //TODO Por adaptar
//
    /* Para obtener todos los Clientes
     * @return ArrayList con todos los objetos Cliente  */


    public ArrayList<Producto> todosLosProductos()
	{
        ArrayList<Producto> resultado = new ArrayList<Producto>();
        for (Object it : root.getChildren()) {
            Element xmlElem = (Element) it;
            try {
                resultado.add(ProductoToObject(xmlElem));
            } catch (ParseException ex) {
                System.out.println(ex.getMessage());
            }
        }
        return resultado;
    }
}






